<?php

class Truncador {
	
	private static function limpar_acentos($string, $posicao_inicial = 0, $tamanho = null) {
		if ($tamanho == null) {
			$tamanho = mb_strlen($string);
		}
		$string = preg_replace('/[aàáâãåäæ]/iu', 'a', $string);
		$string = preg_replace('/[eèéêë]/iu', 'e', $string);
		$string = preg_replace('/[iìíîï]/iu', 'i', $string);
		$string = preg_replace('/[oòóôõöø]/iu', 'o', $string);
		$string = preg_replace('/[uùúûü]/iu', 'u', $string);
		$string = preg_replace('/[ç]/iu', 'c', $string);
		return mb_convert_case(mb_substr($string, $posicao_inicial, $tamanho), MB_CASE_LOWER);
	}
	
	public static function truncar_ao_redor($string, $tamanho, $busca = "") {
		mb_internal_encoding('UTF-8');
		
		if ($busca == "") {
			$retorno = mb_substr($string, 0, $tamanho);
			if ($tamanho < mb_strlen($string)) {
				$retorno .= "(...)";
			}
			return $retorno;
		}
		
		$busca = self::limpar_acentos($busca);
		$string_sem_acentos = self::limpar_acentos($string);
		
		$xf_string = mb_strlen($string);
		$x0_busca = mb_stripos($string_sem_acentos, $busca);
		$xf_busca = $x0_busca + mb_strlen($busca);
		$tamanho_busca = $xf_busca - $x0_busca;
		$margem = ($tamanho - $tamanho_busca) / 2;
		$x0_intervalo = $x0_busca - $margem;
		$xf_intervalo = $xf_busca + $margem;
		if ($x0_intervalo < 0) {
			$x0_resultado = 0;
		}
		elseif ($xf_intervalo > $xf_string) {
			$x0_resultado = $xf_string - $tamanho;
			if ($x0_resultado < 0) {
				$x0_resultado = 0;
			}
		}
		else {
			$x0_resultado = $x0_intervalo;
		}
		$xf_resultado = $x0_resultado + $tamanho;
		
		$substring = mb_substr($string, $x0_resultado, $tamanho);
		
		$antes = "";
		$depois = "";
		
		if ($x0_resultado > 0) {
			$antes = "(...)";
		}
		if ($xf_resultado < $xf_string) {
			$depois = "(...)";
		}
		
		return $antes.$substring.$depois;
	}
}
?>